var app = require('express')();
var config = require('./config/config.js');

var cookieParser = require('cookie-parser');//引入cookie
var session = require('express-session');//引入session
// var FileStore = require('session-file-store')(session);//引入session 储存文件

var bodyParser = require("body-parser"); 
var http=require('http').Server(app);
var io=require('socket.io')(http);

var mongoose = require('./config/mongoose.js');
var User = require('./models/models.js');// 引入模型
var db = mongoose();

var smsClient = require('./plugins/sms.js');

 // var user = new User({
 //     username:'admin1',
 //     password:'123'
 // });
 // user.save((err)=>{ //添加
 //     console.log('save status:', err ? 'failed' : 'success');
 // });


// User.findOne({ //查找一条
//     // username:'admin',
//     password:'123'
// },(err, doc)=>{
//     if(err){
//         res.send('server or db error');
//     }else{
//         console.log('查询成功用户：'+doc);
//         // if(doc==null){
//         //     res.send('用户名或密码有误');
//         // }else{
//         //     req.session.user = {
//         //         _id:doc._id,
//         //         username:doc.username
//         //     };
//         //     res.send('login success');
//         // }
//     }
// })


// 删除
// User.remove({
//   _id:id
// },function (err) {
   
// })
// 改
// User.update({
//   _id:id
// },json,{},function (err) {
   
// })



// 跨域设置
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Credentials", true)
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "X-Requested-With")
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS")
  res.header("X-Powered-By", ' 3.2.1')
  res.header("Content-Type", "application/json;charset=utf-8")
  next()
})
// post 参数获取 转码
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false })); 


app.use(cookieParser());
app.use(session({
    resave: true, //添加 resave 选项
    saveUninitialized: true, //添加 saveUninitialized 选项
    secret: 'aF,.j)wBhq+E9n#aHHZ91Ba!VaoMfC', // 建议使用 128 个字符的随机字符串
    // store:new FileStore({
    //     url: config.dbUrl,
    //     collection:'sessions'
    // })
    cookie : {
        maxAge : 1000 * 60 * 30 // 设置 session 的有效时间，单位毫秒
    }
}))

// app.use(function (req, res, next) {
//   var _user = req.session.user;
//   app.locals.user = _user;
//   return next();
// });

// app.get('/client/apiText.html',function (req,res) {
//     res.send('<h1>welcome</h1>');
// });
app.get('/user', function (req, res){
  res.send({
    "name":"text",
    "passwork":"123456"
  });
});


/**
* res 出错 error 成功 resule
*
*/


/**
* 检查重复 checkIsRegister
* username
*
*/
function checkIsRegister(req, res, haveFun, noFun){
    //查找一条
    User.findOne({$or:[
            {"username":req.body.username},
            {"phone":req.body.phone}]
        },(err, doc)=>{
        console.log(err, doc, "xxxxxxx")
        if(err){
            res.send('server or db error');
        }else{
            if(doc == null || doc.length == 0){
                // 没有记录
                noFun(doc)
            }else{
                // 有记录
                haveFun(doc)
            }
            // console.log('查询成功用户：'+doc);
            // if(doc==null){
            //     res.send('用户名或密码有误');
            // }else{
            //     req.session.user = {
            //         _id:doc._id,
            //         username:doc.username
            //     };
            //     res.send('login success');
            // }
        }
    })
}

/**
* 注册register
*
* username:用户名
* password:密码
* phone:手机号
*/
app.post('/register', function (req, res){
    console.log(req.body)
    checkIsRegister(req, res, function(){
        res.send({
            "error":{
                "message":"账号已经注册"
            }
        });
    }, function(){
        console.log("------")
        var user = new User({
            username:req.body.username,
            password:req.body.password,
            phone:req.body.phone
        });
        user.save((err)=>{ //添加
            console.log(err)
            if(err){
                res.send(err);
            }else{
                res.send({
                    "result":{
                        "message":"注册成功"
                    }
                });
            }
        });
    })
});

/**
* 登陆 login
*
* username:用户名
* password:密码
*/
app.post('/login', function (req, res){
    checkIsRegister(req, res, function(doc){
        // console.log("login:",doc)
        // console.log(req.session)
        req.session.user = {
            _id:doc._id,
            username:doc.username
        };
        if(req.cookies.isFirst){
            res.send({"result":"再次欢迎访问"});
            console.log(req.cookies)
        }else {
            res.cookie('isFirst', 1, { maxAge: 60 * 1000});
            console.log(req.cookies)
            res.send({"result":"欢迎第一次访问"});
        }
        // res.send({
        //     "result":{
        //         "message":"登陆成功",
        //         "status":1
        //     }
        // });
        // console.log(req.session)
        // req.session.regenerate(function(err) {
        //   if(err){
        //     return res.json({ret_code: 2, ret_msg: '登录失败'});        
        //   }
           
        //   req.session.loginUser = doc.username;
        //   res.json({ret_code: 0, ret_msg: '登录成功'});              
        // });

    }, function(){
        res.send({
            "error":{
                "message":"账号或密码错误"
            }
        });
    })
});

/**
* 发送短信
*/
app.post('/sms', function(req, res){
    // req.body.phone
    smsClient.sendSMS({
        PhoneNumbers: req.body.phone,//必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式；发送国际/港澳台消息时，接收号码格式为：国际区号+号码，如“85200000000”
        SignName: '迷聊',//必填:短信签名-可在短信控制台中找到
        TemplateCode: "SMS_149423327",//必填:短信模板-可在短信控制台中找到，发送国际/港澳台消息时，请使用国际/港澳台短信模版
        TemplateParam: '{"code":"12345"}'//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时。
    }).then(function (SMSres) {
        let {Code}=SMSres
        console.log(SMSres,Code)
        if (Code == 'OK') {
            //处理返回参数
            console.log(res)
            res.send({
                "result":{
                    "message":"发送成功"
                }
            });
        }
    }, function (err) {
        console.log(err)
    })
})

// 测试session
app.get('/apiText.html', function(req, res){
    // console.log(req.session)
    // delete req.session.loginUser
    // console.log(req.session)
    if(req.cookies.isFirst){
        res.send({"result":"再次欢迎访问"});
        console.log(req.cookies)
    }else {
        res.cookie('isFirst', 1, { maxAge: 60 * 1000});
        console.log(req.cookies)
        res.send({"result":"欢迎第一次访问"});
    }
})


app.post('/list', function (req, res){
    console.log(req.body)
    res.send([
        {
        "name":"text",
        "date":"123456"
        },
        {
        "name":"text1",
        "date":"12345622"
        },
        {
        "name":"text2",
        "date":"12345622"
        }
    ]);
});

app.listen(3001);



/**
* sokect.io 服务器
*/

//在线用户
var onlineUser={};
var onlineCount=0;

io.on('connection',function (socket) {
    console.log('新用户登录');

    //监听新用户加入
    socket.on('login',function (obj) {
        socket.name=obj.userid;
        socket.room = obj.room || "";
        //检查用户在线列表
        if(!onlineUser.hasOwnProperty(obj.userid)){
            onlineUser[obj.userid]=obj.username;
            //在线人数+1
            onlineCount++;
        }

        // 是否加入组
        if(obj.room){
            socket.on(obj.room, function (data) {
                socket.join(obj.room);
                console.log("join:"+obj.room)
            });
        }
        //广播消息
        io.emit('login',{onlineUser:onlineUser,onlineCount:onlineCount,user:obj});
        console.log(obj.username+"来了");
    })


    //监听用户退出
    socket.on('disconnect',function () {
        //将退出用户在在线列表删除

        if(onlineUser.hasOwnProperty(socket.name)){
            //退出用户信息
            var obj={userid:socket.name, username:onlineUser[socket.name]};
            //删除
            delete onlineUser[socket.name];
            //在线人数-1
            onlineCount--;
            //广播消息
            io.emit('logout',{onlineUser:onlineUser,onlineCount:onlineCount,user:obj});
            socket.leave(socket.room);
            console.log(obj.username+"退出聊天");
        }
    })

    //监听用户发布聊天内容
    socket.on('message', function(obj){
        //向所有客户端广播发布的消息
        if(obj.room){
            io.sockets.in(obj.room).emit('message', obj)
        }else{
            io.emit('message', obj);
        }
        
        console.log(obj.username+'说：'+obj.content || 'img');
    });

    // 向所有对象广播 message
    // socket.emit('message', {username:"系统", content:"welcome"});
})
http.listen(4000, function(){
    console.log('listening on *:4000');
});